/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package _bai02_phantichphankhaibao;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLWriter;

/**
 * Phần đặc tả cần phát sinh code, bao gồm phần khai báo, phần pre và phần post
 * @author Administrator
 */
public class jClass_PhanDacTa implements Interface_CacThanhPhanDacTa{
   // jClass_TruongHopDacTa[] _CacTruongHop;
    private jClass_PhanKhaiBao _phanKhaiBao = new jClass_PhanKhaiBao();
    private jCLass_PhanPre _phanPre = new jCLass_PhanPre();
    private jClass_PhanPost _phanPost;// = new jClass_PhanPost();
    private String _BieuThucDinhDang = ".*"+"/n"+"pre\\s+"+".*"+"/n"+"post\\s+"+".*";

    /**
     * @return the _phanKhaiBao
     */
     public jClass_PhanDacTa(){
      setPhanKhaiBao(_phanKhaiBao);
      _phanPost = new jClass_PhanPost(_phanKhaiBao.getGiaTriTraVe());
      setPhanPre(_phanPre);
      _BieuThucDinhDang =  ".*"+"/n"+"pre\\s+"+".*"+"/n"+"post\\s+"+".*";
    }
    public jClass_PhanDacTa(jClass_PhanKhaiBao phanKhaiBao, jCLass_PhanPre phanPre,jClass_PhanPost phanPost ){
      setPhanKhaiBao(phanKhaiBao);
      setPhanPost(phanPost);
      setPhanPre(phanPre);
      _BieuThucDinhDang =  ".*"+"/n"+"pre\\s+"+".*"+"/n"+"post\\s+"+".*";
    }
    public void jCapNhatTuChuoi(String Str_Dacta) {
       String Str_KhaiBao;
       String Str_Pre;
       String Str_Post;
       String s [] = new String[5];
       s = Str_Dacta.split("pre", 2);
       Str_KhaiBao = s[0].trim();
       s = s[1].split("post", 2);
       Str_Pre = s[0].trim();
       Str_Post = s[1].trim();
        getPhanKhaiBao().jCapNhatTuChuoi(Str_KhaiBao);
        getPhanPost().setGiaTriTraVe(getPhanKhaiBao().getGiaTriTraVe());
        getPhanPre().jCapNhatTuChuoi(Str_Pre);
        getPhanPost().jCapNhatTuChuoi(Str_Post);
    }

    public Boolean jKiemTraChuoiHopDinhDang(String str_ChuoiCanKienTra) {
         String str_ChuoiDaBoSungDauPhanCach = str_ChuoiCanKienTra;
        Pattern pat=Pattern.compile(getBieuThucDinhDang());
        Matcher matcher =pat.matcher(str_ChuoiDaBoSungDauPhanCach);
        return matcher.matches();
    }

    public String taoCPre(int DoLui){
        String Str_KetQua = "";
        Str_KetQua += "bool KiemTraDuLieuNhap_"+_phanKhaiBao.getTenHam()+"(";
        for (jClass_Bien bien : _phanKhaiBao.getCacThamSo()){
            //Thêm kiểu dữ liệu và ' '
            Str_KetQua += jClass_BoTaoCode.jChuyenKieuDuLieu(bien.getKieuDuLieu()) + " ";
            //Thêm tên biến và ", "
             Str_KetQua += bien.getTen() + ","+
                    " ";
            //ví dụ đoạn code hiện tại "int (int a, "
        }
        //ví dụ đoạn code hiện tại "int (int a, int b, "
        //Loại bỏ ", " dư (nếu có)
        if (Str_KetQua.contains("," + " "))
            Str_KetQua = Str_KetQua.substring(0, Str_KetQua.lastIndexOf("," +
                    " "));

        //Thêm ') '
        Str_KetQua += ")";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
       // Str_KetQua += "Boolean KetQua;\n";
        Str_KetQua += _phanPre.jToCCode(DoLui);
       // Str_KetQua += "return KetQua;";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
        return Str_KetQua;
    }
    public String taoCCode(int DoLui){
        String Str_KetQua = "#include \"stdafx.h\"\n//Copy các đoạn sau vào phía dưới phần \"#include:...\" trong file Ten_Project.cpp\n";
        jClass_PhanDacTa phanDacTa = new jClass_PhanDacTa(_phanKhaiBao,_phanPre,_phanPost);
       
        Str_KetQua += taoCPre(DoLui);
        Str_KetQua += "\n";
        Str_KetQua += _phanKhaiBao.jToCCode(DoLui);
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
        //DoLui++;
            if (getPhanPost().getBai() == 1)
                Str_KetQua += jClass_BoTaoCode.jTaoKhaiBaoBien(DoLui,_phanKhaiBao.getGiaTriTraVe())+ "\n";
            Str_KetQua += _phanPost.jToCCode(DoLui) + "\n";
            Str_KetQua += jClass_BoTaoCode.jTaoCapDo(DoLui)+"return "+_phanKhaiBao.getGiaTriTraVe().getTen()+ ";\n";
       //DoLui--;
       
       Str_KetQua+=jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
       Str_KetQua += jClass_BoTaoCode.jTaoCodeC(phanDacTa) ;
       //Str_KetQua += "/n}/n";
       Str_KetQua += "\n";
       return Str_KetQua;
    }
    public String jToCCode(int DoLui) {
        return taoCCode(DoLui);

    }


     public String taoCSharpPre(int DoLui){
        String Str_KetQua = jClass_BoTaoCode.jTaoCapDo(DoLui);
        Str_KetQua += "public static bool KiemTraDuLieuNhap_"+_phanKhaiBao.getTenHam()+"(";
        for (jClass_Bien bien : _phanKhaiBao.getCacThamSo()){
            //Thêm kiểu dữ liệu và ' '
            Str_KetQua += jClass_BoTaoCode.jChuyenKieuDuLieuCS(bien.getKieuDuLieu()) + " ";
            //Thêm tên biến và ", "
            Str_KetQua += bien.getTen() + ","+
                    " ";
            //ví dụ đoạn code hiện tại "int (int a, "
        }
        //ví dụ đoạn code hiện tại "int (int a, int b, "
        //Loại bỏ ", " dư (nếu có)
        if (Str_KetQua.contains("," + " "))
            Str_KetQua = Str_KetQua.substring(0, Str_KetQua.lastIndexOf("," +
                    " "));

        //Thêm ') '
        Str_KetQua += ")";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
       // Str_KetQua += "Boolean KetQua;\n";
        Str_KetQua += _phanPre.jCSharpCode(DoLui);
       // Str_KetQua += "return KetQua;";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
        return Str_KetQua;
    }
     public String taoCSharpCode(int DoLui){
        String Str_KetQua = jClass_BoTaoCode.jTaoCapDo(DoLui) + "using System;\nnamespace " + _phanKhaiBao.getTenHam().trim() + "_namespaces\n";
        Str_KetQua += jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
        Str_KetQua += jClass_BoTaoCode.jTaoCapDo(DoLui) + "class Program \n{\n";
        DoLui++;
        jClass_PhanDacTa phanDacTa = new jClass_PhanDacTa(_phanKhaiBao,_phanPre,_phanPost);
        
        Str_KetQua += taoCSharpPre(DoLui);
        Str_KetQua += "\n";
        Str_KetQua += _phanKhaiBao.jCSharpCode(DoLui);
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
        //DoLui++;
            Str_KetQua += jClass_BoTaoCode.jTaoKhaiBaoBien(DoLui,_phanKhaiBao.getGiaTriTraVe())+ "\n";
            Str_KetQua += _phanPost.jCSharpCode(DoLui) + "\n";
            Str_KetQua += jClass_BoTaoCode.jTaoCapDo(DoLui)+"return "+_phanKhaiBao.getGiaTriTraVe().getTen()+ ";\n";
       //DoLui--;
       Str_KetQua+=jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
       //Str_KetQua += "/n}/n";
       Str_KetQua += "\n";
       Str_KetQua += jClass_BoTaoCode.jTaoCodeCSharp(phanDacTa) ;
       Str_KetQua+=jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
       Str_KetQua+=jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
       return Str_KetQua;
    }
    public String jCSharpCode(int DoLui) {
        return taoCSharpCode(DoLui);
    }

     public String taoVBPre(int DoLui){
        String Str_KetQua = "";
        Str_KetQua += "function KiemTraDuLieuNhap_"+_phanKhaiBao.getTenHam()+"(";
        for (jClass_Bien bien : _phanKhaiBao.getCacThamSo()){
            //Thêm kiểu dữ liệu và ' '
            Str_KetQua += jClass_BoTaoCode.jChuyenKieuDuLieu(bien.getKieuDuLieu()) + " ";
            //Thêm tên biến và ", "
            Str_KetQua += " AS ";
            Str_KetQua += bien.getTen() + ","+
                    " ";
            //ví dụ đoạn code hiện tại "int (int a, "
        }
        //ví dụ đoạn code hiện tại "int (int a, int b, "
        //Loại bỏ ", " dư (nếu có)
        if (Str_KetQua.contains("," + " "))
            Str_KetQua = Str_KetQua.substring(0, Str_KetQua.lastIndexOf("," +
                    " "));

        //Thêm ') '
        Str_KetQua += ") AS Boonlean";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "\n";
       // Str_KetQua += "Boolean KetQua;\n";
        Str_KetQua += _phanPre.jVBNetCode(DoLui);
       // Str_KetQua += "return KetQua;";
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(--DoLui) + "End funtion\n";
        return Str_KetQua;
    }

     public String taoVBCode(int DoLui){
        String Str_KetQua = "";
        jClass_PhanDacTa phanDacTa = new jClass_PhanDacTa(_phanKhaiBao,_phanPre,_phanPost);
        Str_KetQua += jClass_BoTaoCode.jTaoCodeC(phanDacTa) ;
        Str_KetQua += taoVBPre(DoLui);
        Str_KetQua += "\n";
        Str_KetQua += _phanKhaiBao.jVBNetCode(DoLui);
        Str_KetQua+="\n"+jClass_BoTaoCode.jTaoCapDo(DoLui++) + "{\n";
        //DoLui++;
            Str_KetQua += jClass_BoTaoCode.jTaoKhaiBaoBien(DoLui,_phanKhaiBao.getGiaTriTraVe())+ "\n";
            Str_KetQua += _phanPost.jVBNetCode(DoLui) + "\n";
            Str_KetQua += jClass_BoTaoCode.jTaoCapDo(DoLui)+"return "+_phanKhaiBao.getGiaTriTraVe().getTen()+ ";\n";
       //DoLui--;
       Str_KetQua+=jClass_BoTaoCode.jTaoCapDo(--DoLui) + "}\n";
       //Str_KetQua += "/n}/n";
       Str_KetQua += "\n";
       return Str_KetQua;
    }

    public String jVBNetCode(int DoLui) {
        return taoVBCode(DoLui);
    }

    /**
     * @return the _phanPre
     */
    public jCLass_PhanPre getPhanPre() {
        return _phanPre;
    }

    /**
     * @param phanPre the _phanPre to set
     */
    public void setPhanPre(jCLass_PhanPre phanPre) {
        this._phanPre = phanPre;
    }

    /**
     * @return the _phanPost
     */
    public jClass_PhanPost getPhanPost() {
        return _phanPost;
    }

    /**
     * @param phanPost the _phanPost to set
     */
    public void setPhanPost(jClass_PhanPost phanPost) {
        this._phanPost = phanPost;
    }

    private String getBieuThucDinhDang() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    /**
     * @return the _phanKhaiBao
     */
    public jClass_PhanKhaiBao getPhanKhaiBao() {
        return _phanKhaiBao;
    }

    /**
     * @param phanKhaiBao the _phanKhaiBao to set
     */
    public void setPhanKhaiBao(jClass_PhanKhaiBao phanKhaiBao) {
        this._phanKhaiBao = phanKhaiBao;
    }

    /**
     * @param BieuThucDinhDang the _BieuThucDinhDang to set
     */
    public void setBieuThucDinhDang(String BieuThucDinhDang) {
        this._BieuThucDinhDang = BieuThucDinhDang;
    }

    public String taoChuoiHTML ()
    {
        String Kq = "";
        Kq += "<html><head><title></title></head><body></body></html>";
        return Kq;
    }
}
